本节强调的 注意事项应用与所有的 ORM 技术。15.3. Hibernate这节提供了更多细节,同时展示了这些特性和具体上下文的配置。
Spring 的 ORM 集成的主要目标是明确的应用程序分层,包括在任何数据访问、事务技术和松耦合的应用程序对象。没有更多的业务服务依赖于数据访问或事务策略,不再资源查找硬编码,不再强制替换单例,没有更多的自定义服务注册。一个简单的和一致的方法来连接应用程序对象,让他们尽可能的对容器依赖是可以重用并且是自由。所有个人数据访问特性可用的,但可以与Spring 应用程序上下文的概念集成,提供基于 xml 的配置和交叉引用的普通 JavaBean 实例而不需要 Spring-aware(Spring 的意识)。在一个典型的 Spring 应用程序中,许多重要的对象是 JavaBean:数据访问模板,数据访问对象,事务管理器,使用数据访问对象和事务管理器的业务服务, web 视图解析器,使用业务服务的 web 控制器,等等。
典型的商业应用是用重复的资源管理代码杂乱的堆积起来的。很多项目试图创造自己的解决方案,有时为了编程方便来牺牲故障的处理。Spring 提倡简单的处理适当资源的方案,即在JDBC的案例 IoC 通过模板和在 ORM 技术应用 AOP 拦截器。
基础设施提供适当的资源处理,并且能将特定的 API 异常适当的转换为一个未检查的基础的异常层次结构。Spring 引入了 DAO 异常层次结构,适用于任何的数据访问策略。对于直接的 JDBC,在前一节提到的JdbcTemplate
类提供了连接处理和将 SQLException
适当的转换为DataAccessException
层次结构,其中包括将 具体数据库 SQL 错误代码转为有意义的异常类。对于 ORM 技术,见下一节,如何得到相同异常转换的好处。
当涉及到事务管理,JdbcTemplate
类与 Spring 的事务支持挂钩,并且通过各自的 Spring 事务管理器支持 JTA 和 JDBC 事务。为支持 ORM 技术 Spring 提供了通过与 JTA 支持类似的 Hibernate,JPA,和 JDO 事务管理器来实现对 Hibernate,JPA 和 JDO 支持。更多事务的支持,详细信息,参见第12章,事务管理。
当你在 DAO 中使用 Hibernate、JPA 或 JDO 时,你必须决定如何处理持久化技术的原生异常类。运用不同的技术,DAO 会抛出HibernateException
、PersistenceException
或JDOException
的子类。这些异常都是运行时的异常,不需要声明或捕获。你可能必须处理IllegalArgumentException
和IllegalStateException
。这意味着调用者只能将异常处理成为一个通常为致命的问题,除非他们想要依赖于持久化技术自身的异常结构。捕捉乐观锁定失败等具体原因是不可能的除非把调用者与实现策略相联系。取消这交换是可接受的对于应用程序是基于 ORM 和/或 不需要任何特殊的异常处理。然而,Spring 通过 @Repository
注解 来使异常透明的转化:
@Repository
public class ProductDaoImpl implements ProductDao {
// class body here...
}
<beans>
<!-- Exception translation bean post processor -->
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
<bean id="myProductDao" class="product.ProductDaoImpl"/>
</beans>
postprocessor 会自动寻找所有异常转换器( 实现 PersistenceExceptionTranslator
接口),建议所有 bean 标有@Repository
注解,以便发现的转换器可以在抛出异常时拦截和应用适当的转换。
总之:您可以实现 DAO 基于纯持久化技术的API和注解,同时仍然受益于Spring 管理事务,依赖注入、和透明将异常转换(如果需要)为 Spring 的自定义的异常层次结构。